package com.bxmdm.ssoserver.controller;

import cn.dev33.satoken.config.SaTokenConfig;
import cn.dev33.satoken.sso.SaSsoHandle;
import cn.dev33.satoken.sso.SaSsoUtil;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import cn.hutool.json.JSONUtil;
import com.ejlchina.okhttps.OkHttps;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;

/**
 * Sa-Token-SSO Server端 Controller
 */
@RestController
public class SsoServerController {

	/*
	 * SSO-Server端：处理所有SSO相关请求 (下面的章节我们会详细列出开放的接口)
	 */
	@RequestMapping("/sso/*")
	public Object ssoRequest(HttpServletRequest request) {
		System.out.println("请求主机IP"+request.getRemoteAddr()+"请求地址:"+request.getRequestURI()+";请求参数:"+ JSONUtil.toJsonStr(request.getParameterMap()));
		return SaSsoHandle.serverRequest();
	}


	// 自定义接口：获取userinfo
	@RequestMapping("/sso/userinfo")
	public Object userinfo(String loginId, String secretkey) {
		System.out.println("---------------- 获取userinfo --------");

		// 校验调用秘钥
		SaSsoUtil.checkSecretkey(secretkey);

		// 自定义返回结果（模拟）
		return SaResult.ok()
				.set("id", loginId)
				.set("name", "linxiaoyu")
				.set("sex", "女")
				.set("age", 18);
	}

	/**
	 * 配置SSO相关参数
	 */
	@Autowired
	private void configSso(SaTokenConfig cfg) {
		// 配置：未登录时返回的View
		cfg.sso.setNotLoginView(() -> {
			return new ModelAndView("sa-login.html");
		});

		// 配置：登录处理函数
		cfg.sso.setDoLoginHandle((name, pwd) -> {
			// 此处仅做模拟登录，真实环境应该查询数据进行登录
			if("sa".equals(name) && "123456".equals(pwd)) {
				StpUtil.login(10001);
				return SaResult.ok("登录成功！").setData(StpUtil.getTokenValue());
			}
			return SaResult.error("登录失败！");
		});

		// 配置 Http 请求处理器 （在模式三的单点注销功能下用到，如不需要可以注释掉）
		cfg.sso.setSendHttp(url -> {
			return OkHttps.sync(url).get().getBody().toString();
		});
	}

}
